﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Drawing;
using System.Data;

///*
/// Criação Dinâmica de Controles
/// Autor: José Jornando de Carvalho Júnior
/// Data: 01/05/2010
///

namespace CDC
{
    public static class cdc
    {
        private static string[] obterFontes()
        {
            string[] fontes = new string[3];
            fontes[0] = "Courier New";
            fontes[1] = "Arial";
            fontes[2] = "san_serif";
            return fontes;
        }

        const string campo_obrigatorio = "Questão Obrigatória";

        #region Controles

        public static Panel criarPanel(Control pai, string id)
        {
            Panel pn = new Panel();
            pn.ID = id;
            pai.Controls.Add(pn);
            return pn;
        }

        public static void criarLabel(Control pai, int tamanho, string id, string texto)
        {
            Label nomeLabel = new Label();
            nomeLabel.Font.Names = obterFontes();
            nomeLabel.Font.Size = tamanho;
            nomeLabel.Font.Bold = true;
            nomeLabel.Text = texto;
            pai.Controls.Add(nomeLabel);
        }

        public static void criarEdit(Control pai, string id, int tamanhoMax, TextBoxMode tipo, int altura, int largura)
        {
            TextBox tb = new TextBox();
            tb.ID = id;
            tb.MaxLength = tamanhoMax;
            tb.TextMode = tipo;
            tb.Height = altura;
            tb.Width = largura;
            tb.Font.Names = obterFontes();
            if (tipo == TextBoxMode.MultiLine)
            {
                tb.Attributes.Add("onkeyDown", "checkTextAreaMaxLength(this,event,'" + tamanhoMax.ToString() + "')");
            }
            pai.Controls.Add(tb);
        }

        public static DropDownList criarDropDown(string id, List<ListItem> items)
        {
            DropDownList ddl = new DropDownList();
            ddl.ID = id;
            foreach (ListItem item in items)
            {
                ddl.Items.Add(item);
            }
            ddl.Font.Names = obterFontes();
            return ddl;
        }

        public static RadioButtonList criarRadioButtonList(string id, List<ListItem> items)
        {
            RadioButtonList rbl = new RadioButtonList();
            rbl.ID = id;
            foreach (ListItem item in items)
            {
                rbl.Items.Add(item);
            }
            rbl.Font.Names = obterFontes();
            return rbl;
        }

        public static CheckBoxList criarCheckBoxList(string id, List<ListItem> items)
        {
            CheckBoxList cbl = new CheckBoxList();
            cbl.ID = id;
            foreach (ListItem item in items)
            {
                cbl.Items.Add(item);
            }
            cbl.Font.Names = obterFontes();
            //pai.Controls.Add(cbl);
            return cbl;
        }

        public static void AddQuebradeLinha(Control pai)
        {
            pai.Controls.Add(new LiteralControl("<br />"));
        }
        
        public static void AddRegua(Control pai)
        {
            pai.Controls.Add(new LiteralControl("<hr />"));
        }

        public static void AddEspaco(Control pai)
        {
            pai.Controls.Add(new LiteralControl("&nbsp;"));
        }

        public static void AddLiteral(Control pai, string html)
        {
            pai.Controls.Add(new LiteralControl(html));
        }
        
        public static void criarBotao(Control pai, string id, string texto, EventHandler onclick)
        {
            //pai.Controls.Add(new LiteralControl("<center>"));
            Button botao = new Button();
            botao.Text = texto;
            botao.ID = id;
            botao.Click += onclick;
            pai.Controls.Add(botao);
            //pai.Controls.Add(new LiteralControl("</center>"));
        }

        public static void CriarValidationSumary(Control pai)
        {
            ValidationSummary vs = new ValidationSummary();
            vs.HeaderText = "Erros:";
            vs.Width = 400;
            vs.EnableClientScript = false;
            pai.Controls.Add(vs);
        }

        #endregion

        #region Validadores

        private static void criarRequiredFieldValidator(Control pai, string controle, string nro_quest)
        {
            RequiredFieldValidator rfv = new RequiredFieldValidator();
            rfv.ID = "rfv_" + controle;
            rfv.ControlToValidate = controle;
            rfv.ErrorMessage = campo_obrigatorio + ' ' + nro_quest;
            rfv.Text = " *";

            rfv.EnableClientScript = false;
            rfv.Font.Names = obterFontes();
            pai.Controls.Add(rfv);
        }

        public static Control FindControlRecursive(Control Root, string Id)
        {
            if (Root.ID == Id)
                return Root;
            foreach (Control Ctl in Root.Controls)
            {
                Control FoundCtl = FindControlRecursive(Ctl, Id);
                if (FoundCtl != null)
                    return FoundCtl;
            }
            return null;
        }

        private static void ValidaCheckBox(object sender, ServerValidateEventArgs args)
        {
            string cb = ((CustomValidator)sender).ID;
            cb = cb.Substring(3, cb.Length - 3);
            Page pagina = ((CustomValidator)sender).Page;
            args.IsValid = true;
            if (pagina.Master == null)
            {
                if (((CheckBoxList)pagina.FindControl(cb)).SelectedIndex == -1)
                {
                    args.IsValid = false;
                }
            }
            else
            {
                if (((CheckBoxList)FindControlRecursive(pagina.Master, cb)).SelectedIndex == -1)
                {
                    args.IsValid = false;
                }
            }


        }

        private static void ValidaRadioButtonList(object sender, ServerValidateEventArgs args)
        {
            string cb = ((CustomValidator)sender).ID;
            cb = cb.Substring(3, cb.Length - 3);
            Page pagina = ((CustomValidator)sender).Page;
            args.IsValid = true;
            if (pagina.Master == null)
            {
                if (((RadioButtonList)pagina.FindControl(cb)).SelectedIndex == -1)
                {
                    args.IsValid = false;
                }
            }
            else
            {
                if (((RadioButtonList)FindControlRecursive(pagina.Master, cb)).SelectedIndex == -1)
                {
                    args.IsValid = false;
                }
            }
        }

        public static void criarRadioButtonCustonValidator(Control pai, RadioButtonList target)
        {
            CustomValidator cv = new CustomValidator();
            cv.ID = "CV_" + target.ID;
            cv.ErrorMessage = campo_obrigatorio + ' ' + target.Attributes["quest"];
            cv.Text = " *";
            ServerValidateEventHandler sveh = new ServerValidateEventHandler(ValidaRadioButtonList);
            cv.ServerValidate += sveh;
            cv.Font.Names = obterFontes();
            pai.Controls.Add(cv);
        }

        public static void criarCheckBoxCustonValidator(Control pai, CheckBoxList target)
        {
            CustomValidator cv = new CustomValidator();
            cv.ID = "CV_" + target.ID;
            cv.ErrorMessage = campo_obrigatorio + ' ' + target.Attributes["quest"];
            cv.Text = " *";
            ServerValidateEventHandler sveh = new ServerValidateEventHandler(ValidaCheckBox);
            cv.ServerValidate += sveh;
            cv.Font.Names = obterFontes();
            pai.Controls.Add(cv);
        }
        #endregion

        #region Montagem de questões

        public static void criarQuestaoAberta(Control pai, string id, string nro_quest, string pergunta, bool obrigatoria)
        {
            cdc.criarLabel(pai, 12, "lb" + id, pergunta);
            if (obrigatoria)
            {
                cdc.criarRequiredFieldValidator(pai, "tb_" + id, nro_quest);
            }
            AddQuebradeLinha(pai);
            cdc.criarEdit(pai, "tb_" + id, 10, TextBoxMode.MultiLine, 75, 400);
            AddQuebradeLinha(pai);
            AddQuebradeLinha(pai);
        }

        public static void criarQuestaoCombo(Control pai, string id, string nro_quest, string pergunta, List<ListItem> lista, bool obrigatoria)
        {
            DropDownList ddl = cdc.criarDropDown("ddl_" + id, lista);
            ddl.Attributes.Add("quest", nro_quest);
            cdc.criarLabel(pai, 12, "lb" + id, pergunta);
            if (obrigatoria)
            {
                cdc.criarRequiredFieldValidator(pai, "ddl_" + id, nro_quest);
            }
            AddQuebradeLinha(pai);
            pai.Controls.Add(ddl);
            AddQuebradeLinha(pai);
            AddQuebradeLinha(pai);
        }

        public static void criarQuestaoRadio(Control pai, string id, string nro_quest,string pergunta, List<ListItem> lista, bool obrigatoria)
        {
            RadioButtonList rdl = cdc.criarRadioButtonList("rbl_"+id, lista);
            rdl.Attributes.Add("quest", nro_quest);
            cdc.criarLabel(pai, 12, "lb" + id, pergunta);
            if (obrigatoria)
            {
                cdc.criarRadioButtonCustonValidator(pai, rdl);
            }
            AddQuebradeLinha(pai);
            pai.Controls.Add(rdl);
            AddQuebradeLinha(pai);
        }

        public static void criarQuestaoCheck(Control pai, string id, string nro_quest, string pergunta, List<ListItem> lista, bool obrigatoria)
        {
            CheckBoxList cbl = cdc.criarCheckBoxList("cbl_"+id, lista);
            cbl.Attributes.Add("quest", nro_quest);
            cdc.criarLabel(pai, 12, "lb" + id, pergunta);
            if (obrigatoria)
            {
                cdc.criarCheckBoxCustonValidator(pai, cbl);
            }
            AddQuebradeLinha(pai);
            pai.Controls.Add(cbl);
            AddQuebradeLinha(pai);
        }

        public static List<ListItem> montarLista(DataTable dt, string chave, string valor, bool primeiroEmBranco)
        {
            List<ListItem> lista = new List<ListItem>();
            if (primeiroEmBranco)
            {
                lista.Add(new ListItem("", ""));
            }
            foreach (DataRow linha in dt.Rows)
            {
                lista.Add(new ListItem(linha[valor].ToString(), linha[chave].ToString()));
            }
            return lista;
        }

        #endregion



    }
}
